import os
import logging
from logging.config import dictConfig
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
"""

格式	      描述

%(name)s	   记录器的名称
%(levelno)s	数字形式的日志记录级别
%(levelname)s	日志记录级别的文本名称
%(filename)s	执行日志记录调用的源文件的文件名称
%(pathname)s	执行日志记录调用的源文件的路径名称
%(funcName)s	执行日志记录调用的函数名称
%(module)s	   执行日志记录调用的模块名称
%(lineno)s   执行日志记录调用的行号
%(created)s	执行日志记录的时间
%(asctime)s	日期和时间
%(msecs)s	    毫秒部分
%(thread)d  	线程ID
%(threadName)s	线程名称
%(process)d	进程ID
%(message)s	记录的消息
"""

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(name)s:%(lineno)d] [%(pathname)s-%(funcName)s] [%(levelname)s]- %(message)s'
        },
        'user':{
            'format': '%(asctime)s [%(name)s:%(lineno)d] [%(pathname)s-%(funcName)s] [%(levelname)s]- %(message)s'
        }
    },
    'filters': {
    },
    'handlers': {
         'stderr': {
            'level':'INFO',
            'class':'logging.handlers.TimedRotatingFileHandler',
            'filename': os.path.join(BASE_DIR,'logs','stderr','stderr.log'), #或者直接写路径：'filename':'c:\logs\request.log''
            'when': 'midnight',   #午夜12点之后备份前一天的日志
            'delay': False,         #延时写入文件
            'formatter':'standard',
            'encoding':'utf-8',
        },
        'stdout': {
            'level':'INFO',
            'class':'logging.handlers.TimedRotatingFileHandler',
            'filename': os.path.join(BASE_DIR,'logs','stdout','stdout.log'), #或者直接写路径：'filename':'c:\logs\request.log''
            'when': 'midnight',   #午夜12点之后备份前一天的日志
            'delay': False,         #延时写入文件
            'formatter':'standard',
            'encoding':'utf-8',
        },
        'metas':{
            'level':'INFO',
             'class':'logging.handlers.TimedRotatingFileHandler',
            'filename': os.path.join(BASE_DIR,'logs','metas','metas.log'), #或者直接写路径：'filename':'c:\logs\user.log'
            'when': 'midnight',   #午夜12点之后备份前一天的日志
            'delay': False,         #延时写入文件
            'formatter':'standard',
            'encoding':'utf-8',
        },
        'pymata':{
            'level':'INFO',
             'class':'logging.handlers.TimedRotatingFileHandler',
            'filename': os.path.join(BASE_DIR,'logs','matas','mata.log'), #或者直接写路径：'filename':'c:\logs\user.log'
            'when': 'midnight',   #午夜12点之后备份前一天的日志
            'delay': False,         #延时写入文件
            'formatter':'standard',
            'encoding':'utf-8',
        },
    },
    'loggers': {
        'stderr': {   #系统信息
            'handlers': ['stderr'],
            'level': 'INFO',
            'propagate': False
        },
        'stdout': {   #系统信息
            'handlers': ['stdout'],
            'level': 'INFO',
            'propagate': False
        },
        'metas':{   #metas的日志记录
            'handlers':['metas'],
            'level':'INFO',
            'propagate':False
        },
        'pymata':{   #pymata的日志记录
            'handlers':['pymata'],
            'level':'INFO',
            'propagate':False
        }
    }
}



class StreamToLogger(object):
   """
   Fake file-like stream object that redirects writes to a logger instance.
   """
   def __init__(self, logger, log_level=logging.INFO):
      self.logger = logger
      self.log_level = log_level
      self.linebuf = ''

   def write(self, buf):
      for line in buf.rstrip().splitlines():
         self.logger.log(self.log_level, line.rstrip())




class log_directory(object):
    """
    日志目录的检测和创建
    """
    def __init__(self):
        self.log_conf=LOGGING
        self.dir_list=[]  #需要检测和创建的文件夹


    def _get_dir_list(self):
        """
        获取需要创建的目录
        :return:
        """
        handlers=self.log_conf.get("handlers",{})
        for tag,tag_dict in handlers.items():
            dir_path=tag_dict.get("filename","")
            if dir_path!='':
                self.dir_list.append(os.path.dirname(dir_path))

    def check_directorys(self):
        """
        检测和创建目录
        :return:
        """
        self._get_dir_list()
        for sub_dir in self.dir_list:
            if os.path.isdir(sub_dir)==False:
                os.makedirs(sub_dir)




if __name__ == '__main__':
    log_obj=log_directory()
    log_obj.check_directorys()